#pragma once

namespace LSH
{
namespace Graphics
{

class GCNode
{
    typedef std::map<String, GCNode*> childNodeMap;
    typedef std::map<String, GCNode*>::iterator childNodeItr;
    typedef std::map<String, GCNode*>::const_iterator childNodeItrC;
    typedef std::map<String, GCNode*>::value_type childNodeVaule;
public:
    GCNode(void);
    GCNode(const String& name);
    virtual ~GCNode(void);
public:
    const String& getName() { return _name; }
    void SetName(const String& name) { _name = name; }
public:
    GCNode* getParent() { return _pParent; }
    void SetParend(GCNode* pParent) { _pParent = pParent; }

    GCNode* findChild(const String& name);
    bool addChild(GCNode* pChild);
    GCNode* removeChild(const String& name);
    int getChildNumber();
protected:
    String _name;
    GCNode* _pParent;
    childNodeMap _childNodes;
};

} // end Graphics
} // end LSH